//
// Created by DengLibin on 2018/12/12 0012.
//
/**
 * 继承
 * 继承中的构造析构调用原则
1、子类对象在创建时会首先调用父类的构造函数
2、父类构造函数执行结束后，执行子类的构造函数
3、当父类的构造函数有参数时，需要在子类的初始化列表中显示调用
4、析构函数调用的先后顺序与构造函数相反

先构造父类，再构造成员变量、最后构造自己
先析构自己，再析构成员变量、最后析构父类
 */
#include <iostream>
#include <string>
using  namespace std;
 class Fruit
 {
 private:
     string color;
 public:
     Fruit()
     {
         cout <<"Fruit构造函数"<<endl;
     }
     ~Fruit()
     {

         cout << "Fruit析构函数"<< endl;
     }
     string & getColor()
     {
         return this->color;
     }
 };
//公有继承的特点是基类的公有成员和保护成员作为派生类的成员时，它们都保持原有的状态，而基类的私有成员仍然是私有的，不能被这个派生类的子类所访问
class Apple : public Fruit
{
public:
    Apple()
    {
        cout << "Apple构造函数" << endl;
    }
    ~Apple()
    {
        cout << "Apple析构函数" << endl;
    }
};
//私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员，并且不能被这个派生类的子类所访问
class Banana : private Fruit
{

};
//保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员，并且只能被它的派生类成员函数或友元访问，基类的私有成员仍然是私有的
class Orange : protected Fruit
{

};
void testExtends()
{
    Apple apple;
    //Fruit构造函数
    //Apple构造函数
    //Apple析构函数
    //Fruit析构函数
}

int main19()
{
    testExtends();
    return 0;
}